/* 
  ES6中的函数和数组补漏

  -----------------------------------------------------------------------------------------------------------
  对象的函数解构
    我们在前后端分离时，后端经常返回来JSON格式的数据，前端的美好愿望是直接把这个JSON格式数据当作参数，传递到函数内部进行处理。ES6就为我们提供了这样的解构赋值。

  let json = {
    a:'jspang',
    b:'技术胖'
  }
  function fun({a,b='jspang'}){
      console.log(a,b);
  }
  fun(json);  

  -----------------------------------------------------------------------------------------------------------

  数组的函数解构
    函数能解构JSON，那解构我们的数组就更不在话下了，我们看下边的代码。我们声明一个数组，然后写一个方法，最后用…进行解构赋值。
  
  let arr = ['jspang','技术胖','免费教程'];
  function fun(a,b,c){
      console.log(a,b,c);
  }
  
  fun(...arr);  
  这种方法其实在前面的课程中已经学过了，这里我们就当复习了。

  -----------------------------------------------------------------------------------------------------------

  in的用法
    in是用来判断对象或者数组中是否存在某个值的。我们先来看一下用in如何判断对象里是否有某个值。
  
  对象判断  
  let obj={
    a:'jspang',
    b:'技术胖'
  }
  console.log('a' in obj);  //true

  数组判断
    先来看一下ES5判断的弊端，以前会使用length属性进行判断，为0表示没有数组元素。但是这并不准确，或者说真实开发中有弊端。
  let arr=[,,,,,];
  console.log(arr.length); //5  
    上边的代码输出了5，但是数组中其实全是空值，这就是一个坑啊。那用ES6的in就可以解决这个问题。

  let arr=[,,,,,];
  console.log(0 in arr); //false
  let arr1=['jspang','技术胖'];
  console.log(0 in arr1);  // true  
    注意：这里的0指的是数组下标位置是否为空。

  -----------------------------------------------------------------------------------------------------------  

  数组的遍历方法

  1.forEach

    let arr=['jspang','技术胖','前端教程'];
    arr.forEach((val,index)=>console.log(index,val));
      forEach循环的特点是会自动省略为空的数组元素，相当于直接给我们筛空了。当是有时候也会给我们帮倒忙。


  2.filter  

    let arr=['jspang','技术胖','前端教程'];
    arr.filter(x=>console.log(x));
      这种方法在Vue实战里我讲过，他其实也有循环的功能，这里我们在复习一遍。  


  3.some
    
    let arr=['jspang','技术胖','前端教程'];
    arr.some(x=>console.log(x));

  4.map  

    let arr=['jspang','技术胖','前端教程'];
    console.log(arr.map(x=>'web'));
      map在这里起到一个替换的作用，这个我们后续课程会详细讲解。

  
  -----------------------------------------------------------------------------------------------------------  
  
  数组转换字符串
    在开发中我们经常会碰到把数组输出成字符串的形式，我们今天学两种方法，你要注意两种方法的区别。
  
  join()方法
  
    let arr=['jspang','技术胖','前端教程'];
    console.log(arr.join('|'));
      join()方法就是在数组元素中间，加了一些间隔，开发中很有用处。
  
      
  toString()方法  

    let arr=['jspang','技术胖','前端教程'];
    console.log(arr.toString());
      转换时只是是用逗号隔开了

*/

// 对象的函数解构  使用场景,还想不到在哪里用
let json = {
  a:'jspang',
  b:'技术胖'
}
function fun({a,b='web'}){
  console.log(a,b);  //jspang 技术胖 
}
// fun(json);

// 数组的函数解构
let arr=[1,23,4,5,5,6,7,34,23];
function foo(a,b,c){
  console.log(a,b,c);  //  1 23 4
}
// foo(...arr);  //如果是 arr 传,则取出整个数组 如果是 ...arr 取出来的,则是当个值

// in的用法

// 对象判断
let obj={
  a:'wf',
  b:'zhouwenfei'
}
// console.log('a' in obj);  //true


// 数组判断
let arr2=[1,2,3,4,44];
// console.log(0 in arr2);  // true  注意：这里的0指的是数组下标位置是否为空。   这个有点反人类

let arr3=[,,,];
// console.log(arr3.length);  //3  这种ES5方式判断的方式,是不正确的
// console.log(0 in arr3); //false  反人类


// 数组的遍历方法

// 1.forEach
var arr4=[2,3,45,6,7,8];
arr4.forEach((val,index)=>{
//   console.log(val,index);
})

// 2.filter  过滤
var arr5=[3,4,5,6,7];
let list=arr5.filter(x=>{
  return x>4
})
console.log(list);  //[5, 6, 7]

// 2.filter  循环
var arr6=[4,6,7,34,23];
arr6.filter((val,index)=>{
  // console.log(val,index);
})

// 3.some //循环
let arr7=[99,88,77,66];
arr7.some((val,index)=>{
  // console.log(val,index);
})

// 4.map
let arr8=['jspang','技术胖','前端教程'];
console.log(arr8.map(x=>'web'));  //["web", "web", "web"]
// 这样也可以循环
arr8.map((val,index)=>{
  // console.log(val,index);
})

// ----------------------------------
// 数组转换字符串
// join()方法
var arr9=[4,5,63];
console.log(arr9.join('|'));  //  4|5|63
console.log(arr9.toString());  //4,5,63